GameLift RealtimeServer SampleGame「MegaFrogRace」を動かしてみた ~ネット対戦編~
どうも、コンサルティング部の後藤です。
皆さん、Mega Frog Raceをご存じでしょうか?Mega Frog RaceはGameLiftのRealtimeServerの機能を試すことが出来るサンプルゲームになります。
前回の記事でローカル対戦を試せるところまでやってみました。本記事はGameLift RealtimeServerを使用してマッチングを行い、MegaFrogRaceをネット対戦(1人で)を行うところまで試した記事になります。
前回の記事を読んでから読み進めること推奨です。
GameLift RealtimeServer SampleGame「MegaFrogRace」を動かしてみた ~ローカル対戦編~
今回構築する構成に関して
現在、ローカル環境でMegaFrogRaceを実行までは出来ています。今回はMegaFrogRaceのクライアントからCognitoに認証を行い、Lambdaを使用してGameLiftに対してセッションを張って2人揃ったらゲームが始まるような仕組みを作っていきます。
以下の図ではCognitoが抜けていますが、イメージとしては以下のような構成になります。
GameLift構築
スクリプト設定
まず、GameLiftのフリートを作成するためにスクリプトを設定します。スクリプトはMegaFrogRaceのソースコード内にあるServerApp\MegaFrogRaceServer.js
と、こちらから取得できるgameloop.js
をまとめてzip圧縮したものを使用します。
今回はスクリプトの名前をMegaFrogRaceServer
、バージョンを1.00
として設定しています。
スクリプトコードはZipファイルを選択して、先程圧縮したzipファイルを選択してください。
フリート設定
スクリプトが作成出来たら、次はフリートを作成していきます。
フリートの詳細は以下の通りに設定しています。バイナリ型はスクリプトを選択、先程作成したスクリプトを選択してください。
インスタンスタイプに関してはc5.largeで問題ありません。
プロセス管理の設定では、以下のように設定します。設定後、右にある緑マークをクリックしてください。
- 起動パス : /local/game/MegaFrogRaceServer.js
- 起動パラメータ : nothing
- 同時プロセス : 1
「フリートの初期化」をクリックすることでフリートが作成されます。フリートがアクティブになるまでは少し時間が掛かります。
Lambda設定
MegaFrogRaceのソースコードAWS\ClientServiceLambda.js
が今回使用するLambdaのコードになります。
しかし、こちらNode.js 8.10仕様となっており、ブログ執筆時には既にLambdaでNode.js 8.10は動かすことが出来ません。そのため、こちらのコードをNode.js 12.xで動かせるように少し弄る必要があります。
Node.js 8.10と12.xの大きな違いはモジュールが読み込めないことです。aws-sdkはLambdaから読み込むことが出来ますが、今回uuidを使用するため、uuidをnpmで持ってきてあげる必要があります。
以下、Amazon Linux2でNode.js / npm / uuid を導入するまでの手順となります。
Node.js / npm導入 $ curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash - $ sudo yum install --enablerepo=nodesource nodejs uuid取得 $ npm install uuid
また、ClientServiceLambda.js
の中身も少し弄る必要があります。今回は以下の部分を変更しました。
3行目 const uuid = require('uuid'); を以下に変更 const {"v4": uuidv4} = require('uuid'); 5,7行目 const GameLift = new AWS.GameLift({region: 'ap-south-1'}); //使用しているリージョンに変更 const MegaFrogRaceFleetID = "fleet-00aaaa00-a000-00a0-00a0-aa00a000aa0a"; //作成したフリートIDに変更 63行目 PlayerId: uuid.v4() を以下に変更 PlayerId: uuidv4()
uuid取得、コードの変更が完了したらそれらをzipにまとめる
$ ls index.js node_modules package-lock.json $ ls node_modules/ uuid $ zip -r function.zip .
コードの準備が出来たら、Lambdaを作成していきます。
Lambdaは一から作成、関数名は「ConnectClientToServer」で設定して、ランタイムはNode.js 12.xを指定してください。
Lambda関数を作成致しましたら、次にIAMロールの設定を行います。デフォルトのIAMロールにはGameLiftへの権限が無いため、以下を許可するIAMポリシーを作成する必要があります。
- gamelift:CreateGameSession
- gamelift:CreatePlayerSession
- gamelift:SearchGameSessions
- gamelift:DescribeGameSessions
Lambdaの実行結果が失敗していたり、成功しているがStatusで400の返答がある場合は失敗しているためLambdaのコードを見直してみてください。
Cognito設定
クライアントが認証するためにCognitoを使用します。
Cognitoの画面からIDプール作成を選択、IDプール名をMegaFrogRaceAnonPool
、「認証されていないIDに対してアクセスを有効にする」にチェックを入れてください。
また、認証されていない場合のIAMロールを以下のように変更します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Invoke", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], //↓はご自身のアカウントに合わせて要変更 "Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxx:function:ConnectClientToServer" }, { "Effect": "Allow", "Action": [ "mobileanalytics:PutEvents", "cognito-sync:" ], "Resource": [ "" ] } ] }
Cognitoが作成出来たらサンプルコードにてプラットフォーム.Net
に選択し、AWS認証情報部分をメモしておきます。後々使います。
これで、AWS側の設定は完了となります。
RTSClient.csのコード修正
クライアント側が上記CognitoやLambdaを見つけられるようにMegaFrogScript/Race/Assets/Scripts/RTSClient.cs
を弄っていきます。
編集部分は以下の通りです。
237行目 ~ 250行目 AWSConfigs.AWSRegion = "us-east-1"; // 使用しているリージョンを指定 AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest; // paste this in from the Amazon Cognito Identity Pool console CognitoAWSCredentials credentials = new CognitoAWSCredentials( "us-east-1:a00a0aa0-a000-0000-0aa0-0aa00a0009a0", // 上記CognitoIDを記載 RegionEndpoint.USEast1 // 使用しているリージョンを指定 ); AmazonLambdaClient client = new AmazonLambdaClient(credentials, RegionEndpoint.USEast1); // Lambdaリージョンを指定 InvokeRequest request = new InvokeRequest { FunctionName = "ConnectClientToServer", //Lambda名を変更していたら、こちらも変更 InvocationType = InvocationType.RequestResponse };
コードの修正が出来たら、前回同様UnityでMageFrogRaceをビルドします。
ネット対戦してみる
はい、遂にGameLiftと接続してMegaFrogRaceでネット対戦できます!
再ビルドを行ったMegaFrogRace.exeをまず1窓で開き、QUITからGameLiftを選択します。するとWaiting for Other player..
と表示されます。
そうしたらもう一度、MegaFrogRace.exeを起動して2窓でMegaFrogRaceを開きます。セッションに成功すると、2画面でゲームを行うことが出来、リアルタイムにゲームが進行している様子が見れると思います。
また、GameLiftのフリートを確認すると・・・
セッション中のもの、終了しているものが見れると思います。
まとめ
GameLift RealtimeServer SampleGame MegaFrogRaceをローカル対戦、ネット対戦どちらもやってみました。MegaFrogRace自体少々古く、今行うと色々修正必要な個所が多くて動かすまで大変でした。しかし、GameLiftはゲームありきのサービスとなっているため、このようにサンプルゲームを提供して頂けるとRealtimeServerの動作確認だけにとどまらず、様々な検証を行うことが出来るのかなと思いました。
この記事が何方かのお役に立てば幸いです。